home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d11 / frasrc14.arc / FR8514A.ASM < prev    next >
Assembly Source File  |  1990-08-02  |  7KB  |  464 lines

  1.  
  2.  
  3. IFDEF ??version
  4.     MASM51
  5.     QUIRKS
  6. ENDIF
  7.  
  8.     .MODEL    medium,c
  9.  
  10.     .8086
  11.  
  12.  
  13.  
  14. HOPEN    equ    8
  15. HSMX    equ    9
  16. HINT    equ    16
  17. HLDPAL    equ    19
  18. HBBW    equ    21
  19. HBBR    equ    23
  20. HBBCHN    equ    24
  21. HBBC    equ    25
  22. HQMODE    equ    29
  23. HRECT    equ    32
  24. HCLOSE    equ    34
  25. HINIT    equ    48
  26. HSYNC    equ    49
  27. HSPAL    equ    57
  28. HRPAL    equ    58
  29.  
  30.  
  31. .DATA
  32.  
  33.     extrn    xdots:word, ydots:word    ; number of dots across and down
  34.     extrn    dacbox:byte, daccount:word
  35.  
  36. afiptr        dd    0
  37.  
  38. xadj        dw    0
  39. yadj        dw    0
  40.  
  41. extrn        paldata:byte        ; 1024-byte array (in GENERAL.ASM)
  42.  
  43. extrn        stbuff:byte        ; 415-byte array (in GENERAL.ASM)
  44.  
  45. linedata    db    0
  46.  
  47. hopendata    db    3, 0, 0, 0, 0
  48. hclosedata    dw    2, 0
  49. hinitdata    dw    2, 0
  50. bbw        dw    10, 8, 0, 0, 0, 0
  51. bbr        dw    12, 8, 0, 0, 0, 0, 0
  52. smx        dw    2, 0
  53. chn        dw    6
  54.         dd    linedata
  55.         dw    1
  56. pal        dw    10, 0, 0, 256
  57.         dd    paldata
  58. hidata        dw    4, 0, 8000h
  59. amode        dw    18, 9 dup(?)
  60.  
  61. ;svpaldata    dw    769
  62. ;        db    769 dup(?)
  63.  
  64. oops        db    13,10
  65.         db    "Couldn't find the 8514/A interface"
  66.         db    13,10
  67.         db    "(Maybe you forgot to load HDILOAD)"
  68.         db    13,10
  69.         db    "$"
  70.  
  71. .CODE
  72.  
  73.     public
  74.  
  75.  
  76. callafi proc    near
  77.  
  78.     push    ds        ; Pass the parameter pointer
  79.     push    si
  80.  
  81.     shl    ax,1        ; form offset from entry no. required
  82.     shl    ax,1
  83.     mov    si,ax
  84.  
  85.     les    bx, afiptr    ; entry block address to es:bx
  86.     call    dword ptr es:[bx][si]     ; call entry point
  87.  
  88.     ret            ; return to caller
  89.  
  90. callafi endp
  91.  
  92.  
  93.  
  94.  
  95. getafi    proc    near
  96.  
  97.  
  98.     mov    ax,357fh    ; read interrupt vector 7f
  99.     int    21h
  100.     mov    ax,es
  101.     or    ax,bx        ; is 7f vector null
  102.     stc
  103.     jz    getafiret
  104.  
  105.     mov    ax,0105h    ; get Interface address
  106.     int    7fh        ; by software interrupt 7f
  107.  
  108.     jc    getafiret        ; Interface not OK if carry set
  109.  
  110.     mov    word ptr afiptr,dx    ; save afi pointer offset
  111.     mov    word ptr afiptr+2,cx    ; save afi pointer segment
  112.  
  113.     clc            ; clear carry flag
  114.  
  115. getafiret:
  116.     ret            ; return to caller
  117.  
  118. getafi endp
  119.  
  120.  
  121. do85open proc    near
  122.  
  123.     push    ax
  124.     mov    ax, HOPEN
  125.     call    callafi
  126.  
  127.     mov    ax, offset stbuff    ;get the state segment
  128.     add    ax, 15
  129.     mov    cl, 4
  130.     shr    ax, cl
  131.  
  132.     mov    bx, ds
  133.     add    ax, bx
  134.  
  135.     mov    si, offset hinitdata
  136.     mov    [si] + 2, ax
  137.  
  138.     pop    ax
  139.     call    callafi
  140.  
  141.     clc
  142.     ret
  143.  
  144. do85open    endp
  145.  
  146.  
  147. open8514    proc    far
  148.  
  149.     call    getafi        ;get adapter interface
  150.     jc    afinotfound
  151.  
  152. ;    mov    si, offset svpaldata
  153. ;    mov    ax, HSPAL
  154. ;    call    callafi
  155.  
  156.     mov    bl, 0        ;if > 640 x 480 then 1024 x 768
  157.  
  158.     mov    ax, xdots
  159.     cmp    ax, 640
  160.     ja    setupopen
  161.  
  162.     mov    ax, ydots
  163.     cmp    ax, 480
  164.     ja    setupopen
  165.  
  166.     inc    bl
  167.  
  168. setupopen:
  169.  
  170.     mov    si, offset hopendata    ;open the adapter
  171.     mov    byte ptr [si + 2], 40h        ;zero the image but leave pallette
  172.     mov    [si + 3], bl
  173.     mov    ax, HINIT        ;initialize state
  174.  
  175.     call    do85open
  176.     jc    afinotfound
  177.  
  178.     mov    si, offset amode    ;make sure on the size
  179.     mov    ax, HQMODE        ;get the adapter mode
  180.     call    callafi
  181.  
  182.     mov    ax, amode + 10        ;get the screen width
  183.     cmp    ax, xdots
  184.     jae    xdotsok         ;check for fit
  185.     mov    xdots, ax
  186. xdotsok:
  187.     sub    ax, xdots        ;save centering factor
  188.     shr    ax, 1
  189.     mov    xadj, ax
  190.  
  191.     mov    ax, amode + 12        ;get the screen height
  192.     cmp    ax, ydots
  193.     jae    ydotsok
  194.     mov    ydots, ax
  195. ydotsok:
  196.     sub    ax, ydots
  197.     shr    ax, 1
  198.     mov    yadj, ax
  199.     clc
  200.     ret
  201.  
  202. afinotfound:                ; No 8514/A interface found
  203.     mov    ax,03h            ; reset to text mode
  204.     int    10h
  205.     mov    dx,offset oops        ; error out
  206.     mov    ah,9            ; sending the message
  207.     int    21h
  208.     mov    ax,4c00h        ; end the program
  209.     int    21h
  210.     ret                ; should never get here!
  211.  
  212. open8514    endp
  213.  
  214. reopen8514    proc    far
  215.  
  216.     mov    si, offset hopendata    ;open the adapter
  217.     mov    byte ptr [si + 2], 0C0h     ;zero the image but leave pallette
  218.     mov    ax, HSYNC        ;initialize state
  219.     call    do85open
  220.     ret
  221.  
  222. reopen8514    endp
  223.  
  224.  
  225. close8514    proc    far
  226.  
  227.     mov    si, offset hclosedata        ;turn off 8514a
  228.     mov    ax, HCLOSE
  229.     call    callafi
  230.  
  231. ;    mov    si, offset svpaldata        ;restore the pallette
  232. ;    mov    ax, HRPAL
  233. ;    call    callafi
  234.  
  235.     ret
  236.  
  237. close8514    endp
  238.  
  239.  
  240.  
  241.  
  242. fr85wdot    proc    far uses si
  243.  
  244.     mov    linedata, al
  245.  
  246.     mov    bbw + 4, 1        ;define the rectangle
  247.     mov    bbw + 6, 1
  248.     add    cx, xadj
  249.     add    dx, yadj
  250.  
  251.     mov    bbw + 8, cx
  252.     mov    bbw + 10, dx
  253.     mov    si, offset bbw
  254.     mov    ax, HBBW
  255.     call    callafi
  256.  
  257.     mov    si, offset chn
  258.     mov    word ptr [si + 2], offset linedata
  259.     mov    word ptr [si + 6], 1    ;send the data
  260.  
  261.     mov    ax, HBBCHN
  262.     call    callafi
  263.  
  264. fr85wdotx:
  265.     ret
  266.  
  267. fr85wdot    endp
  268.  
  269.  
  270. fr85wbox    proc    far uses si
  271.  
  272.     add    ax, xadj
  273.     add    cx, xadj
  274.     add    dx, yadj
  275.     sub    ax, cx
  276.     mov    chn + 2, si        ;point to data
  277.     mov    chn + 6, ax
  278.     mov    bbw + 4, ax        ;define the rectangle
  279.     mov    bbw + 6, 1
  280.     mov    bbw + 8, cx
  281.     mov    bbw + 10, dx
  282.  
  283.     mov    si, offset bbw
  284.     mov    ax, HBBW
  285.     call    callafi
  286.  
  287.     mov    si, offset chn
  288.     mov    ax, HBBCHN
  289.     call    callafi
  290.  
  291.     ret
  292.  
  293. fr85wbox    endp
  294.  
  295.  
  296. fr85rdot    proc    far uses si
  297.  
  298.     mov    bbr + 4, 1        ;define the rectangle
  299.     mov    bbr + 6, 1
  300.     add    cx, xadj
  301.     add    dx, yadj
  302.     mov    bbr + 10, cx
  303.     mov    bbr + 12, dx
  304.     mov    si, offset bbr
  305.     mov    ax, HBBR
  306.     call    callafi
  307.  
  308.     mov    si, offset chn
  309.     mov    word ptr [si + 2], offset linedata
  310.     mov    word ptr [si + 6], 1    ;send the data
  311.     mov    ax, HBBCHN
  312.     call    callafi
  313.  
  314.  
  315.     mov    al, linedata
  316.  
  317. fr85rdotx:
  318.     ret
  319.  
  320. fr85rdot    endp
  321.  
  322. fr85rbox    proc    far uses si
  323.  
  324.     add    ax, xadj
  325.     add    cx, xadj
  326.     add    dx, yadj
  327.     sub    ax, cx
  328.     mov    chn + 2, di        ;point to data
  329.     mov    chn + 6, ax
  330.     mov    bbr + 4, ax        ;define the rectangle
  331.     mov    bbr + 6, 1
  332.     mov    bbr + 10, cx
  333.     mov    bbr + 12, dx
  334.  
  335.     mov    si, offset bbr
  336.     mov    ax, HBBR
  337.     call    callafi
  338.  
  339.     mov    si, offset chn
  340.     mov    ax, HBBCHN
  341.     call    callafi
  342.  
  343.     ret
  344.  
  345. fr85rbox    endp
  346.  
  347. ;fr85zoom     proc     far uses si
  348. ;
  349. ;    add    ax, xadj        ; ending col
  350. ;    add    bx, yadj        ; ending row
  351. ;    add    cx, xadj        ; starting col
  352. ;    add    dx, yadj        ; starting row
  353. ;    sub    ax, cx            ; how many columns?
  354. ;    inc    ax            ;  this many
  355. ;    sub    bx, dx            ; how many rows?
  356. ;    inc    bx            ;  this many
  357. ;    mov    bbw + 4, ax        ; width
  358. ;    mov    bbw + 6, bx        ; height
  359. ;    mov    bbw + 8, cx        ; source col
  360. ;    mov    bbw + 10, dx        ; source row
  361. ;    add    ax, bx            ; how many dots??
  362. ;    dec    ax            ;  this many
  363. ;    mov    chn + 2, si        ;point to data
  364. ;    mov    chn + 6, ax
  365. ;
  366. ;    mov    si, offset smx        ; define the mix
  367. ;    mov    smx+2, 0016h        ; screen XOR new
  368. ;    mov    ax, HSMX        ; set the mix
  369. ;    call    callafi         ; do it
  370. ;
  371. ;    mov    si, offset bbw        ; set the blit
  372. ;    mov    ax, HBBW        ; blit mem to vid mem
  373. ;    call    callafi         ; do it
  374. ;
  375. ;    mov    si, offset chn        ; set the move
  376. ;    mov    ax, HBBCHN        ; chaining
  377. ;    call    callafi         ; do it
  378. ;
  379. ;    mov    si, offset smx        ; define the mix
  380. ;    mov    smx+2, 0002h        ; overlay
  381. ;    mov    ax, HSMX        ; set the mix
  382. ;    call    callafi         ; do it
  383. ;
  384. ;    ret
  385. ;
  386. ;fr85zoom     endp
  387.  
  388. w8514pal    proc    far
  389.  
  390.     mov    si, offset dacbox
  391.  
  392.     mov    cx, daccount    ;limit daccount to 128 to avoid fliker
  393.     cmp    cx, 128
  394.     jbe    countok
  395.  
  396.     mov    cx, 128
  397.     mov    daccount, cx
  398.  
  399. countok:                ;now build 8514 pallette
  400.     mov    ax, 256         ;from the data in dacbox
  401.     mov    pal + 4, 0
  402.     mov    di, offset paldata
  403.     cld
  404. cpallp:
  405.     push    ax            ;do daccount at a time
  406.     mov    dx, di
  407.     cmp    ax, cx
  408.     jae    dopass
  409.     mov    cx, ax
  410. dopass:
  411.     mov    pal + 6, cx        ;entries this time
  412.     push    cx
  413. cpallp2:
  414.     push    ds            ;pallette format is r, b, g
  415.     pop    es            ;0 - 255 each
  416.  
  417.     lodsb                ;red
  418.     shl    al, 1
  419.     shl    al, 1
  420.     stosb
  421.     lodsb                ;green
  422.     shl    al, 1
  423.     shl    al, 1
  424.     xchg    ah, al
  425.     lodsb                ;blue
  426.     shl    al, 1
  427.     shl    al, 1
  428.     stosw
  429.     mov    al, 0            ;filler
  430.     stosb
  431.     loop    cpallp2
  432.  
  433.     push    si
  434.     push    di
  435.     push    dx
  436.  
  437.     mov    si, hidata        ;wait for flyback
  438.     mov    ax, HINT
  439.     call    callafi
  440.  
  441.     pop    dx
  442.     mov    pal + 8, dx
  443.  
  444.     mov    si, offset pal        ;load this piece
  445.     mov    ax, HLDPAL
  446.     call    callafi
  447.  
  448.     pop    di
  449.     pop    si
  450.     pop    cx
  451.     add    pal + 4, cx        ;increment the pallette index
  452.     pop    ax
  453.     sub    ax, cx
  454.     jnz    cpallp
  455.  
  456.  
  457.     ret
  458.  
  459. w8514pal    endp
  460.  
  461.  
  462.     end
  463.  
  464.